class String

  def underscore
    gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
    gsub(/([a-z\d])([A-Z])/, '\1_\2').
    tr('-', '_').
    gsub(/\s/, '_').
    gsub(/__+/, '_').
    downcase
  end unless method_defined? :underscore
  alias_method :snakecase, :underscore unless method_defined? :snakecase

  def strip_heredoc
    blank  = scan(/^[ \t]*(?=\S)/).min
    indent = blank ? blank.size : 0
    gsub(/^[ \t]{#{indent}}/, '')
  end unless method_defined? :strip_heredoc

end
